diff --git a/sklearn/preprocessing/data.py b/sklearn/preprocessing/data.py
index 705ffef51..73a700a50 100644
--- a/sklearn/preprocessing/data.py
+++ b/sklearn/preprocessing/data.py
@@ -135,7 +135,7 @@ def scale(X, axis=0, with_mean=True, with_std=True, copy=True):
         (e.g. as part of a preprocessing :class:`sklearn.pipeline.Pipeline`).
 
     """  # noqa
-    X = check_array(X, accept_sparse='csc', copy=copy, ensure_2d=False,
+    X = check_array(X, accept_sparse=['csc'], copy=copy, ensure_2d=False, dtype=FLOAT_DTYPES)
                     warn_on_dtype=True, estimator='the scale function',
                     dtype=FLOAT_DTYPES)
     if sparse.issparse(X):
@@ -1342,31 +1342,47 @@ class PolynomialFeatures(BaseEstimator, TransformerMixin):
 
         Parameters
         ----------
-        X : array-like, shape [n_samples, n_features]
+        X : array-like or sparse matrix, shape [n_samples, n_features]
             The data to transform, row by row.
 
         Returns
         -------
-        XP : np.ndarray shape [n_samples, NP]
+        XP : np.ndarray or sparse matrix, shape [n_samples, NP]
             The matrix of features, where NP is the number of polynomial
             features generated from the combination of inputs.
         """
         check_is_fitted(self, ['n_input_features_', 'n_output_features_'])
 
-        X = check_array(X, dtype=FLOAT_DTYPES)
+        # Check if X is a sparse matrix
+        if sparse.isspmatrix(X):
+            X = check_array(X, accept_sparse=['csr', 'csc'], dtype=FLOAT_DTYPES)
+        else:
+            X = check_array(X, dtype=FLOAT_DTYPES)
+
         n_samples, n_features = X.shape
 
         if n_features != self.n_input_features_:
             raise ValueError("X shape does not match training shape")
 
-        # allocate output data
-        XP = np.empty((n_samples, self.n_output_features_), dtype=X.dtype)
-
+        # Generate the combinations of features
         combinations = self._combinations(n_features, self.degree,
                                           self.interaction_only,
                                           self.include_bias)
-        for i, c in enumerate(combinations):
-            XP[:, i] = X[:, c].prod(1)
+        # Allocate output data
+        if sparse.isspmatrix(X):
+            columns = []
+            for c in combinations:
+                # Multiply the features for the current combination
+                # Use .multiply method for sparse matrices
+                out_col = X[:, c[0]]
+                for feature_idx in c[1:]:
+                    out_col = out_col.multiply(X[:, feature_idx])
+                columns.append(out_col)
+            XP = sparse.hstack(columns, format='csr')
+        else:
+            XP = np.empty((n_samples, self.n_output_features_), dtype=X.dtype)
+            for i, c in enumerate(combinations):
+                XP[:, i] = X[:, c].prod(1)
 
         return XP
 
@@ -1431,7 +1447,7 @@ def normalize(X, norm='l2', axis=1, copy=True, return_norm=False):
     else:
         raise ValueError("'%d' is not a supported axis" % axis)
 
-    X = check_array(X, sparse_format, copy=copy,
+    X = check_array(X, accept_sparse=sparse_format, copy=copy,
                     estimator='the normalize function', dtype=FLOAT_DTYPES)
     if axis == 0:
         X = X.T
